home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / book / Chap11 / GLUT / glut.c next >
Encoding:
C/C++ Source or Header  |  1999-09-27  |  3.7 KB  |  158 lines

  1. /*
  2.  * Example program demonstrating the use of glDepthFunc using GLUT for Chapter 11.
  3.  *
  4.  * Written by Michael Sweet.
  5.  *
  6.  * Press the 'd' key to toggle between GL_LESS and GL_GREATER depth
  7.  * tests.  Press the 'ESC' key to quit.
  8.  */
  9.  
  10. #include <GL/glut.h>
  11.  
  12.  
  13. /*
  14.  * Globals...
  15.  */
  16.  
  17. int    Width;               /* Width of window */
  18. int    Height;              /* Height of window */
  19. GLenum DepthFunc = GL_LESS; /* Depth comparison function */
  20.  
  21.  
  22. /*
  23.  * Functions...
  24.  */
  25.  
  26. void Keyboard(unsigned char key, int x, int y);
  27. void Redraw(void);
  28. void Resize(int width, int height);
  29.  
  30.  
  31. /*
  32.  * 'main()' - Open a window and display a sphere and cube.
  33.  */
  34.  
  35. int                /* O - Exit status */
  36. main(int  argc,    /* I - Number of command-line arguments */
  37.      char *argv[]) /* I - Command-line arguments */
  38.     {
  39.     glutInit(&argc, argv);
  40.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
  41.     glutInitWindowSize(792, 573);
  42.     glutCreateWindow("Depth Test Example Using GLUT");
  43.     glutReshapeFunc(Resize);
  44.     glutDisplayFunc(Redraw);
  45.     glutKeyboardFunc(Keyboard);
  46.     glutMainLoop();
  47.     return (0);
  48.     }
  49.  
  50.  
  51. /*
  52.  * 'Keyboard()' - Handle key presses...
  53.  */
  54.  
  55. void
  56. Keyboard(unsigned char key, /* I - Key that was pressed */
  57.          int           x,   /* I - Mouse X position */
  58.      int           y)   /* I - Mouse Y position */
  59.     {
  60.     if (key == 'd' || key == 'D')
  61.         {
  62.     /* Toggle depth test */
  63.         if (DepthFunc == GL_LESS)
  64.             DepthFunc = GL_GREATER;
  65.         else
  66.             DepthFunc = GL_LESS;
  67.  
  68.         Redraw();
  69.         }
  70.     else if (key == 0x1b)
  71.         exit(0);
  72.     }
  73.  
  74.  
  75. /*
  76.  * 'Redraw()' - Redraw the window...
  77.  */
  78.  
  79. void
  80. Redraw(void)
  81.     {
  82.     static float red_light[4]  = {  1.0,  0.0,  0.0,  1.0 };
  83.     static float red_pos[4]    = {  1.0,  1.0,  1.0,  0.0 };
  84.     static float blue_light[4] = {  0.0,  0.0,  1.0,  1.0 };
  85.     static float blue_pos[4]   = { -1.0, -1.0, -1.0,  0.0 };
  86.  
  87.  
  88.     /* Enable drawing features that we need... */
  89.     glEnable(GL_DEPTH_TEST);
  90.     glEnable(GL_LIGHTING);
  91.     glEnable(GL_LIGHT0);
  92.     glEnable(GL_LIGHT1);
  93.  
  94.     glShadeModel(GL_SMOOTH);
  95.     glDepthFunc(DepthFunc); 
  96.  
  97.     /* Clear the color and depth buffers... */
  98.  
  99.     if (DepthFunc == GL_LESS)
  100.         glClearDepth(1.0);
  101.     else
  102.         glClearDepth(0.0);
  103.  
  104.     glClearColor(0.0, 0.0, 0.0, 0.0);
  105.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  106.  
  107.     /*
  108.      * Draw the cube and sphere in different colors...
  109.      *
  110.      * We have positioned two lights in this scene.  The first is red
  111.      * and located above, to the right, and behind the viewer.  The
  112.      * second is blue and located below, to the left, and in front of
  113.      * the viewer.
  114.      */
  115.  
  116.     glLightfv(GL_LIGHT0, GL_DIFFUSE, red_light);
  117.     glLightfv(GL_LIGHT0, GL_POSITION, red_pos);
  118.  
  119.     glLightfv(GL_LIGHT1, GL_DIFFUSE, blue_light);
  120.     glLightfv(GL_LIGHT1, GL_POSITION, blue_pos);
  121.  
  122.     glPushMatrix();
  123.     glTranslatef(-1.0, 0.0, -20.0);
  124.     glutSolidSphere(1.0, 36, 18);
  125.     glPopMatrix();
  126.  
  127.     glPushMatrix();
  128.     glTranslatef(1.0, 0.0, -20.0);
  129.     glRotatef(15.0, 0.0, 1.0, 0.0);
  130.     glRotatef(15.0, 0.0, 0.0, 1.0);
  131.     glutSolidCube(2.0);
  132.     glPopMatrix();
  133.  
  134.     glFinish();
  135.     }
  136.  
  137.  
  138. /*
  139.  * 'Resize()' - Resize the window...
  140.  */
  141.  
  142. void
  143. Resize(int width,  /* I - Width of window */
  144.        int height) /* I - Height of window */
  145.     {
  146.     /* Save the new width and height */
  147.     Width  = width;
  148.     Height = height;
  149.  
  150.     /* Reset the viewport... */
  151.     glViewport(0, 0, width, height);
  152.  
  153.     glMatrixMode(GL_PROJECTION);
  154.     glLoadIdentity();
  155.     gluPerspective(22.5, (float)width / (float)height, 0.1, 1000.0);
  156.     glMatrixMode(GL_MODELVIEW);
  157.     }
  158.